package jgespres;

import java.sql.*;
import java.util.*;
import java.util.logging.*;
import java.awt.Point;

/**
 * Gestion des colaborations Elève / Aide.
 * 
 * @author guerfyld
 * @version 2.0
 */
public class CrossRef {
    // Connexion à la base de données
    private Connection conn;
    // Requêtes préparées
    private PreparedStatement selectCouple;
    private PreparedStatement insertCouple;
    private PreparedStatement updateCouple;
    private PreparedStatement deleteCouple;
    // Liste des couples
    private Map crossRef;
    // Logger
    private Logger logger = Logger.getLogger("jgespres");

    /**
     * Constructeur d'objets de classe CrossRef
     * 
     * @param connection    Connection à une base JDBC
     */
    public CrossRef(Connection connection) {
        // Affectation connection
        conn = connection;
        try {
            // Préparation requêtes
            selectCouple = conn.prepareStatement("SELECT idStd1, idStd2, cnt FROM CrossRef");
            insertCouple = conn.prepareStatement("INSERT INTO CrossRef (idStd1, idStd2, cnt) VALUES( ?, ?, 1)");
            updateCouple = conn.prepareStatement("UPDATE CrossRef SET cnt = ? WHERE idStd1 = ? AND idStd2 = ?");
            deleteCouple = conn.prepareStatement("DELETE FROM CrossRef WHERE idStd1 = ? AND idStd2 = ?");
            
            // Chargement initial
            crossRef  = new HashMap(100);
            load();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Chargement initial de la liste des couples
     */
    public void load() {
        logger.log(Level.FINE, "Chargement CrossRef :");
        
        crossRef.clear();
        try {
            ResultSet rs = selectCouple.executeQuery();
            while (rs.next()) {
                Point Cpl = new Point(rs.getInt(1), rs.getInt(2));
                Integer Cnt = new Integer(rs.getInt(3));
                logger.log(Level.FINEST, "["+Cpl+"]="+Cnt);
                crossRef.put(Cpl, Cnt);
            }
            
            logger.log(Level.CONFIG, "- crossRef="+crossRef.size());
            logger.log(Level.INFO, "Chargement CrossRef ok.");
        }
        catch(Exception e) {
            logger.log(Level.SEVERE, "ERREUR Chargement CrossRef :");
            e.printStackTrace();
        }
    }
    
    /**
     * Affectation nombres de collaborations
     * 
     * @param stdId     Elève
     * @param hlpId     Aide
     * @param cnt       Incrément
     */
    public void setCount(int stdId, int hlpId, int cnt) {
        try {
            Point Cpl = new Point(stdId, hlpId);
            Integer Cnt = (Integer) crossRef.get(Cpl);
            if (Cnt != null) {
                int val = Cnt.intValue() + cnt;
                if (val <= 0) {
                    // Suppression Base
                    deleteCouple.setInt(1, stdId);
                    deleteCouple.setInt(2, hlpId);
                    deleteCouple.executeUpdate();
                    // Suppression Liste
                    crossRef.remove(Cpl);
                }
                else {
                    // Mise à jour base
                    updateCouple.setInt(1, val);
                    updateCouple.setInt(2, stdId);
                    updateCouple.setInt(3, hlpId);
                    updateCouple.executeUpdate();
                    // Mise à jour Liste
                    crossRef.put(Cpl, new Integer(val));
                }
            }
            else {
                // Mise à jour base
                insertCouple.setInt(1, stdId);
                insertCouple.setInt(2, hlpId);
                insertCouple.executeUpdate();
                crossRef.put(Cpl, new Integer(1));
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Renvoi nombres de collaborations
     * 
     * @param stdId     Elève
     * @param hlpId     Aide
     * @return          Nombre de collaboration
     */
    public int getCount(int stdId, int hlpId) {
        Integer Cnt = (Integer) crossRef.get(new Point(stdId, hlpId));
        if (Cnt != null)
            return Cnt.intValue();
        else
            return 0;
    }
}
